package com.itheima.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.anno.LogOperation;
import com.itheima.exception.PasswordNotMatchException;
import com.itheima.exception.UsernameNotExistException;
import com.itheima.mapper.EmpExprMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.pojo.*;
import com.itheima.service.EmpLogService;
import com.itheima.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * 员工管理Service层实现类
 */
@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;

    @Autowired
    private EmpLogService empLogService;

    /**
     * 分页查询员工数据
     */
    @Override
    public PageResult<Emp> page(EmpRequestParam empRequestParam) {
        //设置分页参数
        PageHelper.startPage(empRequestParam.getPage(), empRequestParam.getPageSize());

        //调用mapper层方法查询数据
        List<Emp> empList = empMapper.list(empRequestParam);

        //封装成PageResult对象并返回
        Page<Emp> result = (Page<Emp>) empList;
        return new PageResult<>(result.getTotal(), result.getResult());
    }

    /**
     * 添加员工
     */

    @LogOperation
    @Transactional(rollbackFor = Exception.class)//添加事务管理
    @Override
    public void add(Emp emp) {
        try {
            //1、添加员工的基本信息
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            empMapper.insert(emp);

            //2、添加对应员工的工作经历信息
            List<EmpExpr> exprList = emp.getExprList();
            if (exprList != null && !exprList.isEmpty()) {
                exprList.forEach(expr -> {
                    expr.setEmpId(emp.getId());
                });
                empExprMapper.insertBatch(exprList);
            }
        } finally {
            log.info("当前即将添加的员工：{}", emp);
            EmpLog empLog = new EmpLog();
            empLog.setOperateTime(LocalDateTime.now());
            empLog.setInfo("添加员工：" + emp);
            empLogService.insertLog(empLog);
        }
    }

    /**
     * 批量删除员工
     */
    @LogOperation
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void deleteEmpByIds(List<Integer> ids) {
        //删除员工的基本信息
        empMapper.deleteByIds(ids);

        //删除员工的工作经历信息
        empExprMapper.deleteByEmpIds(ids);
    }

    /**
     * 根据id查询员工信息
     */
    @Override
    public Emp selectEmpById(Integer id) {
        //调用mapper层方法查询员工信息并返回
        return empMapper.selectById(id);
    }

    /**
     * 修改员工信息
     */
    @LogOperation
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void update(Emp emp) {
        //1、修改员工基本信息
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);

        //2、修改员工工作经历信息
        //2.1、先删除原来的工作经历信息
        empExprMapper.deleteByEmpIds(Collections.singletonList(emp.getId()));
        //2.2、再添加新的工作经历信息
        List<EmpExpr> exprList = emp.getExprList();
        if (exprList != null && !exprList.isEmpty()) {
            exprList.forEach(expr -> {
                expr.setEmpId(emp.getId());
            });
            empExprMapper.insertBatch(exprList);
        }
    }

    /**
     * 查询员工性别报表数据
     * */
    @Override
    public List<Map<String, Object>> getEmpGenderReport() {
        return empMapper.getEmpGenderReport();

    }

    /**
     * 查询各职位员工人数报表数据
     * */
    @Override
    public JobOption getEmpJobReport() {
        //查询显示各部门的名称以及对应的人数，并将结果以Map集合的形式封装到一个List集合中
        List<Map<String, Object>> results = empMapper.getEmpJobReport();

        //对查询结果进行处理，遍历集合，将部门名称和部门人数分别封装到两个List集合中
        List<String> jobList = results.stream().map(map -> map.get("jobs").toString()).toList();
        List<Long> dataList = results.stream().map(map -> (Long)map.get("nums")).toList();


        //将两个List集合封装到JobOption对象中，并返回
        return new JobOption(jobList, dataList);
    }

    /**
     * 查询所有员工信息
     * */
    @Override
    public List<Emp> selectAll() {
        return empMapper.selectAll();
    }

    /**
     * 登录验证
     * */
    @Override
    public Emp checkLogin(Emp emp) {
        //1、调用持久层EmpMapper，根据用户名查询员工信息
        Emp loginEmp =empMapper.selectByUsername(emp.getUsername());

        //2、判断员工是否存在，如果不存在，账户不存在
        if(loginEmp == null){
            //业务异常，走异常处理机制，全局异常处理器，封装登录失败结果
            throw new UsernameNotExistException("用户名不存在");
        }

        //3、如果存在，比较密码，如果不匹配，密码错误
        if(!Objects.equals(loginEmp.getPassword(),emp.getPassword())){
            throw new PasswordNotMatchException("密码错误");
        }

        //4、如果匹配，返回员工信息
        return loginEmp;
    }
}
